/*
知识要点：
	一、默认值
		给某个字段设置了默认值default，如果初始化没有赋值，则以默认值为准
	二、模式修饰符
		1、预定义修饰符
			如：trim: true,则表示去除字段前后的空格，或者字段大小写的转换等
		2、自定义修饰符：
			set自定义修饰符：
				表示存入数据库前触发，也就是模型转为文档时触发
			get自定义修饰符：
				表示从数据库读取数据后，触发的事件，也就是从文档转为模型时触发
	三、虚拟属性
		虚拟属性是指数据库中并没有实质存在的东西，但是可以通过操作，让某些字段
		像存在数据库中的数据一样显示出来
	四、索引
		1、唯一索引 unique，用于检测是否唯一
		2、辅助索引 index，用于查询速度
*/
const mongoose = require('mongoose');
const uri = 'mongodb://localhost/htl';
const db = mongoose.connect(uri);

const TestSchema = new mongoose.Schema({
  msgTime: {
    type: String,
    default: Date.now, //默认值
    index: true //辅助索引，用于查询速度
  },
  name: {
    type: String,
    unique: true, //唯一索引，表示name字段是唯一性的
    trim: true //去除name字段前后的空格
  },
  blogUrl: {
    type: String,
    set: function (url) {
      //set自定义修饰符，表示写入数据库的数据没有http://或者没有https://，则添加http://
      if (url.indexOf('http://') == -1 && url.indexOf('https://') == -1) {
        url = 'http://' + url;
      }
      return url;
    }
  },
  blogUrl2: {
    type: String,
    get: function (url) {
      //get自定义修饰符，表示数据库取出数据没有http://或者没有https://，则添加上http://来显示
      if (url.indexOf('http://') == -1 && url.indexOf('https://') == -1) {
        url = 'http://' + url;
      }
      return url;
    }
  },
  firstName: String, //用于虚拟属性
  lastName: String //用于虚拟属性
});

//虚拟属性用法，将数据库中的firstName和lastName，合并成一个fullName的字段。
//数据库中是不存在的，但是输出htl.fullName，是存在该字段
TestSchema.virtual('fullName').get(function () {
  return this.firstName + ' ' + this.lastName;
});
//这里设置，数据库取出后的模型实例，转成json格式的时候，就把虚拟属性一起写入数据中。如：
/*Htl.find({firstName: 'Huang'},(err,doc) => {
	if(err) return console.log('err:' + err);
	console.log('doc',JSON.stringify(doc));     //这里就是将doc转出json，所以这里的输出，数据里面是包含fullName字段的
})*/
TestSchema.set('toJSON', { virtuals: true }); // 注意：在使用 aggregate 查询时，虚拟属性不生效

const Htl = mongoose.model('cc', TestSchema, 'cc');
const htl = new Htl({
  name: '     two                ',
  blogUrl2: 'www.taobao.com',
  firstName: 'Huang',
  lastName: 'Tianlong'
});

// htl.save();

// console.log(JSON.stringify(htl));

//查找User的所以数据
Htl.find({ firstName: 'Huang' }, (err, doc) => {
  if (err) return console.log('err:' + err);
  console.log('doc', JSON.stringify(doc));
});
